package com.jmb.api.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jmb.api.common.exception.LeaseException;
import com.jmb.api.common.result.ResultCodeEnum;
import com.jmb.api.model.entity.Module;
import com.jmb.api.service.ModuleService;
import com.jmb.api.mapper.ModuleMapper;
import com.jmb.api.vo.module.ModuleInfoVo;
import com.jmb.api.vo.module.ModuleUpdateVo;
import com.jmb.api.vo.module.ModuleVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
* @author jinbo
* @description 针对表【module】的数据库操作Service实现
* @createDate 2025-04-08 13:53:56
*/
@Service
public class ModuleServiceImpl extends ServiceImpl<ModuleMapper, Module>
    implements ModuleService{
    @Autowired
    private ModuleMapper moduleMapper;
    @Override
    public void saveModule(ModuleVo moduleVo) {
        LambdaQueryWrapper<Module> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Module::getModuleName,moduleVo.getModuleName());
        if (this.count(queryWrapper)>0){
            throw new LeaseException(ResultCodeEnum.WEB_API_MODULE_NAME);
        }
        Module module = new Module();
        BeanUtils.copyProperties(moduleVo,module);
        this.save(module);
    }

    @Override
    public void updateModule(ModuleUpdateVo moduleUpdateVO) {
        LambdaQueryWrapper<Module> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Module::getModuleName,moduleUpdateVO.getModuleName()).ne(Module::getModuleId,moduleUpdateVO.getModuleId());
        if (this.count(queryWrapper)>0){
            throw new LeaseException(ResultCodeEnum.WEB_API_MODULE_NAME);
        }
        Module module = new Module();
        BeanUtils.copyProperties(moduleUpdateVO,module);
        LambdaUpdateWrapper<Module> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Module::getModuleId,moduleUpdateVO.getModuleId());
        this.update(module,updateWrapper);
    }

    @Override
    public IPage<ModuleInfoVo> getModuleList(IPage<ModuleInfoVo> page, String projectName, String moduleName) {

        return moduleMapper.selectModuleList(page,projectName,moduleName);
    }

    @Override
    public ModuleInfoVo getModuleById(Integer moduleId) {
        if (moduleId==null){
            throw new LeaseException(ResultCodeEnum.WEB_API_ID_NOT_NULL);
        }
        Module module = moduleMapper.selectById(moduleId);
        ModuleInfoVo moduleInfoVo = new ModuleInfoVo();
        BeanUtils.copyProperties(module,moduleInfoVo);
        return moduleInfoVo;
    }

    @Override
    public Long getModuleCount(Integer moduleId) {
        if (moduleId==null){
            throw new LeaseException(ResultCodeEnum.WEB_API_ID_NOT_NULL);
        }
        LambdaQueryWrapper<Module> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Module::getModuleId,moduleId);
        return moduleMapper.selectCount(queryWrapper);
    }

    @Override
    public List<String> getModuleProjectId(Integer moduleId, Integer projectId) {
        if (moduleId==null&&projectId==null){
            throw new LeaseException(ResultCodeEnum.WEB_API_ID_NOT_NULL);
        }
        return moduleMapper.getModuleProjectId(moduleId,projectId);
    }

    @Override
    public ArrayList<Module> getAllModule(Integer projectId) {
        LambdaQueryWrapper<Module> moduleLambdaQueryWrapper = new LambdaQueryWrapper<>();
        moduleLambdaQueryWrapper.eq(Module::getProjectId,projectId);
        List<Module> moduleList = moduleMapper.selectList(moduleLambdaQueryWrapper);
        return new ArrayList<>(moduleList);
    }


}




